#include <REGX52.H>

sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;

/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void I2C_star()
{
	I2C_SDA = 1;
	
	I2C_SCL = 1;
	I2C_SDA = 0;
	
	I2C_SCL = 0;
}

/**
  * @brief  I2C停止
  * @param  无
  * @retval 无
  */
void I2C_stop()
{
	I2C_SDA = 0;
	
	I2C_SCL = 1;
	I2C_SDA = 1;
}

/**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void I2C_SendByte(unsigned char Byte)
{
	unsigned char i=0;
	for(i=0;i<8;i++)
	{
		I2C_SDA = Byte &(0x80>>i);
		I2C_SCL = 1;//I2C_SCL从 0 - 1 这个时间，看数据手册，很短，所以我这个可以不用延时
		I2C_SCL = 0;
	}
		
}
/**
  * @brief  I2C接收一个字节
  * @param  无
  * @retval 接收到的一个字节数据
  */
unsigned char I2C_ReceiveByte()
{
	unsigned char i=0,Byte=0x00;
	I2C_SDA = 1;//接受的时候，要先把I2C_SDA置1，表示是接受，这个不会影响后面的接收值，他会内部改，
	
	for(i=0;i<8;i++)
	{
		I2C_SCL = 1;//表示接收了，就直接置1开始接收
		if(I2C_SDA)//如果接收到了1
		{
			Byte = Byte|(0x80>>i);//就把第i位的1，给data里面的0，就是 |
		}
		I2C_SCL = 0;
	}
	return Byte;
}

/**
  * @brief  I2C发送应答
  * @param  AckBit 应答位，0为应答，1为非应答
  * @retval 无
  */
void I2C_SendAck(unsigned char AckBit)//只管发，不管收
{
	I2C_SDA = AckBit;
	I2C_SCL = 1;//I2C_SCL从 0 - 1 这个时间，看数据手册，很短，所以我这个可以不用延时
	I2C_SCL = 0;
}

/**
  * @brief  I2C接收应答位
  * @param  无
  * @retval 接收到的应答位，0为应答，1为非应答
  */
unsigned char I2C_ReceiveAck()//只管接，不管发，所以要有接收置
{
	unsigned char AckBit;
	I2C_SDA = 1;//表示是接受，
	
	I2C_SCL = 1 ;//这其实相当于是等待接收
	AckBit = I2C_SDA;//上面的置1，不会影响这个接收位，因为接收到了，他自己会变
	I2C_SCL = 0;
	
	return AckBit;
}